package com.wzw.springboot.principle.mvc.converter;

import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * 消息转换器：用于将HTTP中的请求内容，转换为想要的数据类型。
 * 通常来说，就是一类数据传输格式对应一种消息转换器。如：前后端通过JSON格式传递。
 *
 * 自定义时一般是继承 AbstractHttpMessageConverter 接口，它实现了绝大部分的 HttpMessageConverter 方法
 * 扩展了可以根据请求元数据类型来决定是否使用此消息转换器，代码注释中也说了Spring内部大部分的消息转换器也都是基于此类实现
 *
 * RequestResponseBodyMethodProcessor 对于含有@ResponseBody的类或方法，会进入它对于的返回值类型处理器
 * 所有的序列化器会被加载到上面这个类中，是一个List。而这类实现了controller方法的解析和返回处理类
 *
 * @author Wangzhiwen
 */
public class CustomizedHttpMessageConverter extends AbstractHttpMessageConverter<Object> {

    /**
     * 指定编码格式和支持的元数据类型，因为AbstractHttpMessageConverter内部使用了此参数去判断是否支持对应请求的消息转换
     */
    public CustomizedHttpMessageConverter() {
        super(StandardCharsets.UTF_8, MediaType.APPLICATION_JSON);
    }

    /**
     * 支持什么类型
     * @param clazz Class
     * @return true false
     */
    @Override
    protected boolean supports(Class<?> clazz) {
        return false;
    }


    @Override
    protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        return null;
    }

    @Override
    protected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {

    }
}
